package snippet;

import java.io.File;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.PageOrientation;
import jxl.format.PaperSize;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class BarToExcle{

    /** *********创建字体**************** */
    public WritableFont BlodFont ;             // 粗体
    public WritableFont NormalFont ;        // 普通字体
    public WritableFont BarCodeFont ;         // 条形码字体
    /** ************以下设置几种格式的单元格属性************ */
    public WritableCellFormat wcf_header ;    // 标题样式
    public WritableCellFormat wcf_left ;    // 用于正文左
    public WritableCellFormat wcf_barcode ; // 用于条形码格式
    
    
    public BarToExcle() {        
        
        /** ********* 初始化字体 **************** */
        BlodFont = new WritableFont(WritableFont.ARIAL, 20, WritableFont.BOLD ) ;
        NormalFont = new WritableFont(WritableFont.ARIAL, 15);
        BarCodeFont = new WritableFont(WritableFont.ARIAL, 15, WritableFont.BOLD);
        
        try {
            /** ********* 初始化单元格属性 **************** */
            // 初始化标题样式
            wcf_header = new WritableCellFormat(BlodFont, NumberFormats.TEXT) ; // 实例化单元格格式对象（标题、居中）
            wcf_header.setBorder(Border.ALL, BorderLineStyle.THIN) ;    // 线条
            wcf_header.setVerticalAlignment(VerticalAlignment.CENTRE);     // 垂直对齐
            wcf_header.setAlignment(Alignment.CENTRE);                     // 水平对齐
            wcf_header.setBackground(Colour.GRAY_25) ;                    // 背景颜色
            wcf_header.setWrap(true);                                     // 是否换行
            
            // 用于正文左
            wcf_left = new WritableCellFormat(NormalFont);                // 实例化单元格格式对象（正文、左对齐）
            wcf_left.setBorder(Border.ALL, BorderLineStyle.THIN);         // 线条
            wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE);     // 垂直对齐
            wcf_left.setAlignment(Alignment.LEFT);
            wcf_left.setLocked(false) ;                                    // 设置锁定，还得设置SheetSettings启用保护和设置密码
            wcf_left.setWrap(true);                                     // 是否换行
            
            // 用于条形码格式
            wcf_barcode = new WritableCellFormat(BarCodeFont);            // 实例化单元格格式对象（第一列、条形码）
            wcf_barcode.setBorder(Border.ALL, BorderLineStyle.THIN);     // 线条
            wcf_barcode.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
            wcf_barcode.setAlignment(Alignment.CENTRE);
            wcf_barcode.setLocked(true) ;                                // 设置锁定，还得设置SheetSettings启用保护和设置密码
            wcf_barcode.setWrap(true);                                     // 是否换行
        } catch (WriteException e) {
            e.printStackTrace();
        }
    }
    
    
    // 创建Excle及工作表
    public int createExcle(StringBuffer buf) {
        String barCodes[] = null ;
        try {
            /** ********** 创建工作薄  ********** **/
            WritableWorkbook workbook = Workbook.createWorkbook(new File("d:" + File.separator + "barcode.xls")) ;
            /** ********** 创建工作表  ********** **/
            WritableSheet sheet = workbook.createSheet("条形码", 0) ;
            
            /** ********* 打印属性 **************** */
            sheet.getSettings().setOrientation(PageOrientation.LANDSCAPE) ;    // 设置为横向打印
            sheet.getSettings().setPaperSize(PaperSize.A4) ;            // 设置纸张
            sheet.getSettings().setFitHeight(297) ;                        // 打印区高度
            sheet.getSettings().setFitWidth(210) ;                        // 打印区宽度    
            // 设置列宽
            sheet.setColumnView(0, 10); // 第1列
            sheet.setColumnView(1, 30); // 第2列
            sheet.setColumnView(2, 15);
            sheet.setColumnView(3, 15);
            sheet.setColumnView(4, 30);
            sheet.setColumnView(5, 40);
            // 设置边距            
            sheet.getSettings().setTopMargin(0.5) ;
            sheet.getSettings().setBottomMargin(0.3) ;
            sheet.getSettings().setLeftMargin(0.1) ;
            sheet.getSettings().setRightMargin(0.1) ;
            // 设置页脚
            sheet.getSettings().getFooter().getCentre().appendPageNumber() ;    // 为页脚添加页数
            sheet.getSettings().setFooterMargin(0.07) ;                            // 设置页脚边距（下）
            // 设置保护，并加密码 锁定的Cell才会起作用
            sheet.getSettings().setProtected(true) ;                            // 启用保护
            sheet.getSettings().setPassword("xing5156") ;                        // 设置保护密码
            // 设置打印标题行
            sheet.getSettings().setPrintHeaders(true) ;                            // 启用打印头信息
            sheet.getSettings().setPrintGridLines(true);
//            sheet.getSettings().setPrintTitlesRow(0, 0) ;                        // 设置标题行
            
            /** *********插入标题内容**************** */
            sheet.addCell(new Label(0, 0, "条码", this.wcf_header));
            sheet.addCell(new Label(1, 0, "公司", this.wcf_header));
            sheet.addCell(new Label(2, 0, "部门", this.wcf_header));
            sheet.addCell(new Label(3, 0, "姓名", this.wcf_header));
            sheet.addCell(new Label(4, 0, "类型", this.wcf_header));
            sheet.addCell(new Label(5, 0, "描述", this.wcf_header));

            barCodes = buf.toString().split("◎") ;
            for(int i = 0, y = 1; i < barCodes.length; i++, y++) {
                sheet.setRowView(y, 400) ;
                sheet.addCell(new Label(0, y, barCodes[i], this.wcf_barcode)) ;
                sheet.addCell(new Label(1, y, "", this.wcf_left)) ;
                sheet.addCell(new Label(2, y, "", this.wcf_left)) ;
                sheet.addCell(new Label(3, y, "", this.wcf_left)) ;
                sheet.addCell(new Label(4, y, "", this.wcf_left)) ;
                sheet.addCell(new Label(5, y, "", this.wcf_left)) ;
            }
            
            /** **********以上所写的内容都是写在缓存中的，下一句将缓存的内容写到文件中******** */
            workbook.write();
            /** *********关闭文件************* */
            workbook.close();
            System.out.println("导出成功");
            
        } catch (Exception e) {
            System.out.println("在输出到EXCEL的过程中出现错误，错误原因：" + e.toString());
        }
        return barCodes.length ;
    }
    /**
     * 构建Workbook对象, 将内容读取到内存中再更新到原来文件中 
     * 最后关闭写入操作来完成文件更新
     * @param buf 该对象中包含（11AA◎55BC◎523A）类似的数据，以◎拆分
     * @return    返回本次更新条数
     */
    public int updateExcle(StringBuffer buf) throws Exception {            // 更新Excle
        
        File file = new File("d:" + File.separator + "barcode.xls") ;
        Workbook wb = null;
        if(file.exists()) {
            wb = Workbook.getWorkbook(file);
            WritableWorkbook wwb = Workbook.createWorkbook(file, wb);
            // 读取第一张工作表
            WritableSheet sheet = wwb.getSheet(0) ;
            
            int count = sheet.getRows() ;
            String barCodes[] = buf.toString().split("◎") ;
            for(int i = count , y = 0; y < barCodes.length; y++ , i++) {
                sheet.setRowView(i, 400) ;
                sheet.addCell(new Label(0, i, barCodes[y], this.wcf_barcode)) ;
                sheet.addCell(new Label(1, i, "", this.wcf_left)) ;
                sheet.addCell(new Label(2, i, "", this.wcf_left)) ;
                sheet.addCell(new Label(3, i, "", this.wcf_left)) ;
                sheet.addCell(new Label(4, i, "", this.wcf_left)) ;
                sheet.addCell(new Label(5, i, "", this.wcf_left)) ;
            }
            wwb.write() ;
            wwb.close() ;
            wb.close() ;
            System.out.println("更新完成！") ;
            return barCodes.length ;
        } else {
            return createExcle(buf) ;
        }
    }
    
    // 测试
    public static void main(String args[]) {
        StringBuffer buf = new StringBuffer() ;        // 测试数据
        buf.append("56KF").append("◎").append("12AA").append("◎").append("23GH").append("◎").append("55JJ") ;
        try {
            BarToExcle bte = new BarToExcle() ;
            bte.updateExcle(buf) ;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
